iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Vue.js

用 Nuxt Content 搭配 Obsidian 建立自己的 Digital Garden系列 第 28

為 Digital Garden 新增留言功能

  • 分享至 

  • xImage
  •  

在我之前的 Blog 是使用 Disqus 作為留言系統,但他讀取速度慢,且被買下來後就開始有些商業成份,管理留言也不方便,所以在架設 Digital Garden 時,我希望能順便換一個留言系統。

在我之前研究各個 Digital Garden 網站時,有看到一個是依賴於 GitHub 的留言系統實作,當時沒有記錄下來,但印象深刻。剛剛使用「GitHub 留言 blog」作為關鍵字去尋找時,看到 Nyo 寫的 utterances: 使用 GitHub issue 做部落格的留言系統 一文,滑到最下面看他的實際樣貌,對,就是這個!

透過這個方式,就能在靜態網站上也能擁有一個留言系統,而且又是透過開發者熟悉的 GitHub,我也很方便去管理。至於這樣會不會是一個留言門檻,我預期我的網站受眾主要還是以資訊社群為主,如果不會用 GitHub,或許我可以新增一個 Twitter 分享的按鈕,讓他分享時 mention 我去詢問。就我的經驗,其實會想留言的訪客其實不多,反倒是垃圾訊息會比較麻煩,權衡之下,用這樣的系統建構留言功能是一個好的方向。

但比較遺憾的是,留言的內容畢竟還是放在雲端上,會覺得資料不是掌握在自己手上有點不安與可惜。所以我預期會將好的留言,透過截圖的方式,另外存成筆記保留下來,這樣哪天我若又不得不換一個留言系統時,也能將這些好的內容留存。我也可以透過這個方式將 Disqus 的留言轉換到新網站上。

脈絡言至於此,就來實作看看吧!—— 到今天為止,是這樣的沒錯。但在拜訪了 utterances 的官網後,發現已經有段時間沒有更新了,著實讓人有點擔心,所以就又嘗試找找看有沒有替代方案。

於是就找到了受 utterances 啟發,並改用 GitHub Discussions 驅動的留言系統—— giscus

可以先來到其官網,他本身就附帶了一個套用程式碼的產生器,並有詳盡的說明引導你為要作為留言區的 Repository 做正確的設定,並協助驗證。

經過一連串的選擇後,他會協助產生如下圖的程式碼:

然而這樣的形式不一定適合直接套用在基於 Vue.js 的 Nuxt Content 上,萬幸的是他也有提供各大前端框架的元件使用,在 Vue.js 上的事 @giscus/vue,那就來安裝吧!

$ pnpm i @giscus/vue

先為這個套件提供的元件做一個 Adapter,建立 @/components/Adapt/AdaptGiscus.vue,其 Props 可以參照透過官網產生器所產出的 data- 屬性。

<template>
  <Giscus
      id="comments"
      repo="fntsrlike/local-garden"
      repoId="R_kgDOKfSl8Q"
      category="giscus"
      categoryId="DIC_kwDOKfSl8c4CaFL7"
      mapping="pathname"
      strict="0"
      reactionsEnabled="1"
      emitMetadata="0"
      inputPosition="top"
      :theme="theme"
      lang="zh-TW"
      loading="lazy"
    />
</template>
<script setup lang="ts">
import Giscus from '@giscus/vue'

const colorMode = useColorMode()
const theme = computed(() => `${colorMode.value}_protanopia` )
</script>

我預計會建立一個名為 <PostMessageBoard /> 的元件放在 @/components/Post/Page.vue<article /> 下方。

<template>
  <article class="pb-4">
     <PostHeader :post="post"/>
     <PostContent :post="post"/>
     <PostFooter :post="post"/>
   </article>
   <PostMessageBoard />
</template>

接著來實作 @/components/PostMessageBoard.vue,算是避免未來要換留言系統時,可以只改一個地方的封裝。也可以在這邊寫一些期望留言遵守的規範。

<template>
  <section>
    <header>
      <h2 class="sr-only">Comments</h2>
    </header>
    <main>
      <AdaptGiscus />
    </main>
  </section>
</template>
<script setup lang="ts">
import AdaptGiscus from '../Adpat/AdaptGiscus.vue';
</script>

如此便大功告成了!

也能隨著我們的關燈模式去做佈景主題的變換:


上一篇
為每一頁分頁標題都加上網站名稱
下一篇
將 Digital Garden 部署到網路上
系列文
用 Nuxt Content 搭配 Obsidian 建立自己的 Digital Garden30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言